package org.ciallo.easytokencore.context.model;

import org.ciallo.easytokencore.context.EasyContextHolder;
import org.ciallo.easytokencore.util.VerificationUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.Map;

/**
 * Easy-Token 请求包装类
 *
 * <p>核心功能：</p>
 * <ul>
 *   <li>封装HTTP请求的常用操作</li>
 *   <li>提供统一的参数获取接口</li>
 *   <li>支持请求体、请求头和Cookie的参数获取</li>
 *   <li>简化Token获取逻辑</li>
 * </ul>
 *
 * <p>主要方法：</p>
 * <ul>
 *   <li>getParam(): 获取请求体参数</li>
 *   <li>getHeader(): 获取请求头参数</li>
 *   <li>getCookieValue(): 获取Cookie值</li>
 *   <li>getEasyToken(): 获取Easy-Token</li>
 * </ul>
 *
 * <p>使用示例：</p>
 * <pre>
 * {@code
 * // 获取请求参数
 * String username = EasyContextHolder.getRequest().getParam("username");
 *
 * // 获取Easy-Token
 * String token = EasyContextHolder.getRequest().getEasyToken();
 * }
 * </pre>
 *
 * @Description: Easy-Token 请求包装类
 * @Author: Jukomu
 * @Package: org.ciallo.easytokencore.context.model
 * @Project: easy-token-demo
 * @Version: 1.0.0
 * @name: EasyRequest
 * @Date: 2025-05-06
 * @Filename: EasyRequest
 * @see EasyContextHolder
 */
public class EasyRequest {
    private final HttpServletRequest request;

    public EasyRequest(HttpServletRequest request) {
        this.request = request;
    }

    /**
     * 在 [ 请求体 ] 里获取一个参数值
     *
     * @param name 键
     * @return 值
     */
    public String getParam(String name) {
        return request.getParameter(name);
    }

    /**
     * 在 [ 请求体 ] 里获取一个参数值，值为空时返回默认值
     *
     * @param name         键
     * @param defaultValue 值为空时的默认值
     * @return 值
     */
    public String getParam(String name, String defaultValue) {
        String value = getParam(name);
        if (VerificationUtils.isNull(value)) {
            return defaultValue;
        }
        return value;
    }

    /**
     * 在 [ 请求体 ] 里检测提供的参数是否为指定值
     *
     * @param name  键
     * @param value 值
     * @return 是否相等
     */
    public boolean isParam(String name, String value) {
        String paramValue = getParam(name);
        return VerificationUtils.isNotNull(paramValue) && paramValue.equals(value);
    }

    /**
     * 在 [ 请求体 ] 里检测请求是否提供了指定参数
     *
     * @param name 参数名称
     * @return 是否提供
     */
    public boolean hasParam(String name) {
        return VerificationUtils.isNotNull(getParam(name));
    }

    /**
     * 获取 [ 请求体 ] 里提交的所有参数名称
     *
     * @return 参数名称列表
     */
    public Collection<String> getParamNames() {
        return null;
    }

    /**
     * 获取 [ 请求体 ] 里提交的所有参数
     *
     * @return 参数列表
     */
    public Map<String, String> getParamMap() {
        return null;
    }

    /**
     * 在 [ 请求头 ] 里获取一个值
     *
     * @param name 键
     * @return 值
     */
    public String getHeader(String name) {
        return request.getHeader(name);
    }

    /**
     * 在 [ 请求头 ] 里获取一个值
     *
     * @param name         键
     * @param defaultValue 值为空时的默认值
     * @return 值
     */
    public String getHeader(String name, String defaultValue) {
        String value = getHeader(name);
        if (VerificationUtils.isNull(value)) {
            return defaultValue;
        }
        return value;
    }

    /**
     * 在 [ Cookie作用域 ] 里获取一个值
     *
     * @param name 键
     * @return 值
     */
    public String getCookieValue(String name) {
        return null;
    }

    /**
     * 在 [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
     *
     * @param name 键
     * @return 值
     */
    public String getCookieFirstValue(String name) {
        return null;
    }

    /**
     * 在 [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
     *
     * @param name 键
     * @return 值
     */
    public String getCookieLastValue(String name) {
        return null;
    }

    public String getEasyToken() {
        String authorization = EasyContextHolder.getRequest().getHeader("Authorization");
        if (authorization != null && authorization.startsWith("Easy-Token ")) {
            // "Easy-Token "的长度为11
            return authorization.substring(11);
        }
        return null;
    }
}
